<?php
/**
 * ページネーション補助クラス
 * Pagenation
 */

class Pagenation {
	public $AllCount;
	public $ViewCount;
	public $ViewPage;
	public $NowPage;
	public $FirstPage;
	public $LastPage;
	public $StepCount;

	public function init () {
		Y('this.Init+', YuTori::Create($this, 'initPagenation'));
		Y('this.setAllCount+', YuTori::Create($this, 'setAllCount'));
		Y('this.setViewCount+', YuTori::Create($this, 'setViewCount'));
		Y('this.setViewPage+', YuTori::Create($this, 'setViewPage'));
		Y('this.setNowPage+', YuTori::Create($this, 'setNowPage'));
		Y('this.setFirstPage+', YuTori::Create($this, 'setFirstPage'));
		Y('this.setLastPage+', YuTori::Create($this, 'setLastPage'));
		Y('this.setStepCount+', YuTori::Create($this, 'setStepCount'));
		
		$this->initPagenation ();
		return true;
	}
	
	public function call () {
		$objPage = new PagenationObject ();
		$objPage->NowPage = $this->NowPage;

		// ページ数の計算
		$objPage->AllPage = ceil($this->AllCount / $this->ViewCount);

		// 前ページがあるか
		if ($this->NowPage > 1) {
			$objPage->isPrev = true;
			$objPage->Prev = $this->NowPage - 1;
		} else {
			$objPage->isPrev = false;
			$objPage->Prev = 0;
		}
		
		// Limit とOffsetの計算
		$objPage->Limit = $this->ViewCount;
		$objPage->Offset = ($this->NowPage - 1) * $this->ViewCount;

		// 表示するページの配列を生成
		if ($this->ViewPage) {
			// 現在ページが表示するページ数の半分に満たない時は、ページ1から表示する
			$HalfPageCnt = floor($this->ViewPage/2) -1 + ($this->ViewPage%2);
			if (1 > $_Page = $this->NowPage - $HalfPageCnt - 1) $_Page = 0;
			
			// 現在ページが最終ページに近い時はマイナスから開始する
			if ($this->LastPage != 0 && $objPage->AllPage > $this->LastPage) {
				$LastPage = $this->LastPage;
			} else {
				$LastPage = $objPage->AllPage;
			}

			if ($HalfPageCnt > $LastPage - $this->NowPage) $_Page -= $HalfPageCnt - ($LastPage - $this->NowPage) + 1 - ($this->ViewPage%2);

			for ($i = 0; $i < $this->ViewPage; $i++) {
				$Page = ($i + $this->FirstPage + $_Page);
				if ($Page < 1) continue;
				if ($Page > $LastPage) break;
				$objPage->Pages[] = $Page * $this->StepCount;
			}
		} else {
			for ($i = 0; $i < $objPage->AllPage; $i++) {
				$objPage->Pages[] = ($i + $this->FirstPage) * $this->StepCount;
			}
		}

		// 最後のページかどうか
		if ($this->NowPage < $objPage->AllPage){
			$objPage->isNext = true;
			$objPage->Next = $this->NowPage + 1;
		} else {
			$objPage->isNext = false;
			$objPage->Next = 0;
		}
		
		return $objPage;
	}

	public function initPagenation () {
		$this->AllCount = 0;
		$this->ViewCount = 10;
		$this->ViewPage = 5;
		$this->NowPage = 1;
		$this->FirstPage = 1;
		$this->LastPage = 0;
		$this->StepCount = 1;

		$this->isPrev = false;
		$this->Prev = 0;
		$this->isNext = false;
		$this->Next = 0;
	}

	public function setAllCount ($AllCount) {
		$this->AllCount = (int)$AllCount;
	}

	public function setViewCount ($ViewCount) {
		// 0が指定されるとエラーになるため補正
		if (!$i = (int)$ViewCount) $i = 10;
		$this->ViewCount = $i;
	}

	public function setViewPage ($ViewPage) {
		$this->ViewPage = (int)$ViewPage;
	}

	public function setNowPage ($NowPage) {
		// 0が指定されるとエラーになるため補正
		if (!$i = (int)$NowPage) $i = 1;
		$this->NowPage = $i;
	}

	public function setFirstPage ($FirstPage) {
		$this->FirstPage = (int)$FirstPage;
	}

	public function setLastPage ($LastPage) {
		$this->LastPage = (int) $LastPage;
	}

	public function setStepCount ($StepCount) {
		$this->StepCount = (int)$StepCount;
	}
}

/**
 * 戻り値用
 * PagenationObject
 */
class PagenationObject {
	public $isPrev;  // 前のページが存在するときはtrue、それ以外はfalse
	public $Prev;    // 前のページ
	public $isNext;  // 次のページが存在するときはtrue、それ以外はfalse
	public $Next;    // 次のページ数
	public $AllPage; // 全ページ数
	public $NowPage; // 現在のページ
	public $Pages;   // 表示するページが入った配列
	public $Limit;   // DBに渡すLIMIT値が入ります。
	public $Offset;  // DBに渡すOFFSET値が入ります。
}

?>